package cn.ym.system.service.impl;

import cn.ym.basic.service.impl.BaseServiceImpl;
import cn.ym.basic.utils.AssertUtil;
import cn.ym.basic.utils.PageList;
import cn.ym.org.domain.Department;
import cn.ym.system.domain.Menu;
import cn.ym.system.mapper.MenuMapper;
import cn.ym.system.query.MenuQuery;
import cn.ym.system.service.MenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * 业务层：菜单
 */
@Service
public class MenuServiceImpl extends BaseServiceImpl<Menu> implements MenuService {

    @Autowired
    private MenuMapper menuMapper;
    /**
     * 添加
     * @param menu
     */
    @CacheEvict(cacheNames = "menuTree",key = "'ALL'")
    @Transactional//默认只读为false，默认传播机制为REQUIRED[有且仅有一个事务]
    @Override
    public void add(Menu menu) {
        AssertUtil.isNotEmpty(menu.getName(),"亲：菜单名称不能为空");
        AssertUtil.isNotEmpty(menu.getComponent(),"亲：请输入菜单组成部分");
        AssertUtil.isNotEmpty(menu.getUrl(),"亲：请输入菜单URL");
        menuMapper.add(menu);
    }

    /**
     * 修改
     * @param menu
     */
    @CacheEvict(cacheNames = "menuTree",key = "'ALL'")
    @Transactional//默认只读为false，默认传播机制为REQUIRED[有且仅有一个事务]
    @Override
    public void update(Menu menu) {
        AssertUtil.isNotEmpty(menu.getName(),"亲：菜单名称不能为空");
        AssertUtil.isNotEmpty(menu.getComponent(),"亲：请输入菜单组成部分");
        AssertUtil.isNotEmpty(menu.getUrl(),"亲：请输入菜单URL");
        menuMapper.update(menu);
    }

    /**
     * 删除
     * @param id
     */
    @Transactional//默认只读为false，默认传播机制为REQUIRED[有且仅有一个事务]
    @Override
    @CacheEvict(cacheNames = "menuTree",key = "'ALL'")
    public void delete(Long id) {
        menuMapper.delete(id);
        //第一种：先删除reids里面的缓存，
        //redisTemplate.delete("menuTree");
    }

    /**
     * 批量删除
     * @param ids
     */
    @Transactional//默认只读为false，默认传播机制为REQUIRED[有且仅有一个事务]
    @Override
    @CacheEvict(cacheNames = "menuTree",key = "'ALL'")
    public void patchDel(Long[] ids) {
        menuMapper.patchDel(ids);
        //第一种：先删除reids里面的缓存，
        //redisTemplate.delete("menuTree");
    }


    /**
     * 部门树
     * @return
     */
    @Cacheable(cacheNames = "menuTree",key = "'ALL'")
    @Override
    public List<Menu> menuTree() {
        //1.先查询出所有的部门
        List<Menu> menuList = menuMapper.findAll();
        //2.装到map集合里面---方便通过id查询部门对象
        HashMap<Long, Menu> map = new HashMap<>();
        for (Menu menu : menuList) {
            map.put(menu.getId(),menu);
        }
        //3.再用一个集合来装所有的数据
        List<Menu> menuTree = new ArrayList<>();
        //4.再次进行遍历部门对象
        for (Menu menu : menuList) {
            if (menu.getParentId()==null){//ParentId为null，代表着它就是顶级部门
                menuTree.add(menu) ; //添加到部门树
            }else {//有父级部门id
                Long parentId = menu.getParentId();
                //获取父部门对象
                Menu parentMenu = map.get(parentId);
                if (parentMenu != null){//避免修改数据时 出现空指针异常
                    //将自己状态父部门的children集合中
                    parentMenu.getChildren().add(menu);
                }
            }
        }
        return menuTree;
    }

}
